#!/usr/bin/env python
# -*- coding:utf-8 -*-

from os           import environ
from os.path      import join
from pprint       import pprint
from clasificador import *
from recfacial    import *

from datos import vfaces

import pylab
import matplotlib.pyplot           as plt
import mpl_toolkits.mplot3d.axes3d as p3
import matplotlib
import numpy
from   numpy        import *
from   PIL          import Image
from   random       import randint
from   matplotlib   import *
from   config       import Config

def prueba(mat = vfaces):
    """docstring for prueba"""
    return acp(mat)

def test_apc(args):
    """Prueba del algoritmo PCA"""

    muestra("Cargando configuración")
    conf = Config()
    conf.configura( join(environ["DIRCONF"],'refac.conf') )

    vfaces, pruebas, entrena = creaMatriz( args, range(1,conf.personas + 1) )

    #abrir una imagen para obtener su tamaño
    im = numpy.array(Image.open(vfaces[0]))
    #obtener el tamaño de las imágenes
    m,n = im.shape

    #obtener el número de imágenes
    imnent = len(entrena)

    #crear matriz para almacenar todas las imágenes aplanado
    muestra_ini("Cargando imágenes de entrenamiento...")
    enmatrix = numpy.array(
        [numpy.array(Image.open(entrena[i])).flatten() for i in range(imnent)],
        'f')
    muestra_fin()

    #obtener el número de imágenes
    imnprb = len(pruebas)

    muestra_ini("Cargando imágenes de entrenamiento...")
    prbmatrix = numpy.array(
        [numpy.array(Image.open(pruebas[i])).flatten() for i in range(imnprb)],
        'f')
    muestra_fin()

    muestra_ini("Calculando PCA...")
    # realizar pca
    V,S,immean, eigencaras = pca(enmatrix)

    muestra( "Covarianza      %dx%d" % V.shape          )
    muestra( "Imagen media    %dx%d" % immean.shape     )
    muestra( "Valores propios %d"    % S.shape[0]       )
    muestra( "Eigencaras      %dx%d" % eigencaras.shape )

    muestra_ini("Calculando PCA...")
    # realizar pca
    V,S,immean, eigencaras = pca(enmatrix)
    a, vpmin, nu, porcentaje = errorCuadratico(S)

    muestra("Resultados del Error Cuadrático Medio...")
    muestra("a          = %s" % str(a)          )
    muestra("vpmin      = %s" % str(vpmin)      )
    muestra("nu         = %s" % str(nu)         )
    muestra("porcentaje = %s" % str(porcentaje) )

    muestra_ini("Calculando PCA...")
    V,S,immean, eigencaras = pca(enmatrix,vpmin-1)

    muestra( "Covarianza      %dx%d" % V.shape          )
    muestra( "Imagen media    %dx%d" % immean.shape     )
    muestra( "Valores propios %d"    % S.shape[0]       )
    muestra( "Eigencaras      %dx%d" % eigencaras.shape )

if __name__ == '__main__':
    #test_apc(join( environ["DIRBD"], "bdorl" ))
    conf = Config()
    conf.configura( join(environ["DIRCONF"],'refac.conf') )

    P = acp(vfaces)
    a, vpmin, nu, EOpt, energia = errorCuadratico( P.d )
    #print P.aCadena()
    muestra( a )
    muestra( vpmin )
    muestra( nu )
    muestra( EOpt )
    muestra( energia )

    plt.figure()
    plt.plot(energia,'-*m', markerfacecolor='pink',markeredgecolor='pink')
    plt.plot(
        vpmin,nu,'-*m',            linewidth=10, markerfacecolor='black',
        markeredgecolor='black', markersize=10)
    plt.axis([-2,12,-0.2,1.2])

    P = acp( vfaces, vpmin - 1 )

    eigencaras = P.Vp

    em, en = eigencaras.shape
    neig   = 6

    muestra_ini("Mostrando las primeras %d eigencaras" % en)
    pylab.figure()
    pylab.plot()
    pylab.title("Eigencaras")

    for i in range( neig ):
        eigcara = eigencaras[:,i]
        mode = eigcara.reshape((10,10))
        pylab.subplot(2,3,i+1)
        pylab.gray()
        pylab.imshow(mode)

    pylab.show()

#    print "P.C = "
#    print print_mat( P.C )
#    print "P.D = "
#    print print_mat( P.D )
#    print "P.Vp = "
#    print print_mat( P.Vp )
#    print "P.Yfg = "
#    print print_mat( P.Yfg )
#    print "P.d = "
#    print print_arr( P.d )
#    print "P.mf = "
#    print print_mat( P.mf )

